package com.heihei.decompression;

import com.heihei.decompression.script.DeComUtil;
import com.heihei.util.CommandUtil;
import com.heihei.util.FileUtilF;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;

/**
 *  解压 直接执行
 *
 * @version 1.0
 * @since JDK1.8
 * @author duanhengfei
 * @date 2021年01月28日 10:05:50
 */
public class DeComDemoExe {
    public static void main(String[] args) throws IOException {
        startDecompressExe();
        //测试解压方法
//        File file = new File("E:\\飞\\@@编程相关.zip");
//        dePress(file, file.getParentFile(), "hello");
//        System.out.println("OK");
    }

    /**
     * 开启交互式解压（解压目标是所选文件夹下的所有压缩包）
     *
     * @param
     * @Return
     * @throws
     * @author duanhengfei
     * @date 2021年01月31日 13:31:19
     */
    public static void startDecompressExe() throws IOException {
        StringBuilder sb = new StringBuilder();

        Scanner sc = new Scanner(System.in);
        System.out.println("请输入源文件目录");
        //源目录
        File validSrcPath = FileUtilF.getValidSrcPath();

        //密码
        String password = null;

        System.out.println("是否有密码？");
        String inputStr = sc.nextLine().trim();

        if("Y".equalsIgnoreCase(inputStr) || "YES".equalsIgnoreCase(inputStr)) {
            //有密码
            System.out.println("请输入密码");
            password = sc.nextLine();
        }

        final String endPassword = password;

        System.out.println("是否解压到当前文件夹？");
        inputStr = sc.nextLine().trim();
        //如果在此处输入Y，则不嵌套；否则，则嵌套
        System.out.println("是否取消嵌套文件夹？");
        String inputNest = sc.nextLine().trim();
        if("Y".equalsIgnoreCase(inputStr) || "YES".equalsIgnoreCase(inputStr)) {
            //解压到当前文件夹
            FileUtilF.handleFiles(validSrcPath, (file) -> {
                String name = file.getName().toLowerCase();
                if(Arrays.asList(DeComDemo.getComs()).contains(FileUtilF.getExtensionName(name).toUpperCase())) {
                    System.out.println(">>==============================开始解压：" + file.getAbsolutePath() + "==============================<<");
                    String command = DeComUtil.generateLine(file, endPassword, ("Y".equalsIgnoreCase(inputNest) || "YES".equalsIgnoreCase(inputNest)) ? false : true, false);
                    CommandUtil.exeCmd(command);
                }
            });

        } else {
            //需要指定目录
            System.out.println("请输入目标文件夹");
            final File validDesDir = FileUtilF.getValidDesDir();
            FileUtilF.handleFiles(validSrcPath, (file) -> {
                String name = file.getName().toLowerCase();
                if(Arrays.asList(DeComDemo.getComs()).contains(FileUtilF.getExtensionName(name).toUpperCase())) {
                    //多截取出来的路径
                    String substring = file.getAbsolutePath().substring(validSrcPath.getAbsolutePath().length());
                    File newValidDesDir = new File(validDesDir, substring);
                    if("Y".equalsIgnoreCase(inputNest) || "YES".equalsIgnoreCase(inputNest)) {
                        System.out.println(">>==============================开始解压：" + file.getAbsolutePath() + "==============================<<");
                        String command = DeComUtil.generateLine(file, newValidDesDir.getParentFile(), endPassword, false);
                        CommandUtil.exeCmd(command);
                    } else {
                        System.out.println(">>==============================开始解压：" + file.getAbsolutePath() + "==============================<<");
                        String command = DeComUtil.generateLine(file, new File(newValidDesDir.getParent(), FileUtilF.removeExtension(name)), endPassword, false);
                        CommandUtil.exeCmd(command);
                    }
                }
            });
        }
        System.out.println("End==============================全部解压完成，请前往目标目录查看：" + validSrcPath.getAbsolutePath() + "==============================End");


    }



    /**
     * 解压
     *
     * @param file 要解压的压缩包文件
     * @param desFileDir 要解压到哪儿（指出来一个目录，这个目录必须存在）
     * @param password 密码
     * @Return
     * @throws
     * @author duanhengfei
     * @date 2021年01月31日 13:21:14
     */
    public static void dePress(File file, File desFileDir, String password){
        String command = DeComUtil.generateLine(file, desFileDir, password, false);
        CommandUtil.exeCmd(command);
    }

    /**
     * 解压（无密码）
     *
     * @param file 要解压的压缩包文件
     * @param desFileDir 要解压到哪儿（指出来一个目录，这个目录必须存在）
     * @Return
     * @throws
     * @author duanhengfei
     * @date 2021年01月31日 13:21:14
     */
    public static void dePress(File file, File desFileDir){
        dePress(file, desFileDir, null);
    }

    /**
     * 解压到当前文件夹，无密码
     *
     * @param file
     * @Return
     * @throws
     * @author duanhengfei
     * @date 2021年01月31日 13:26:46
     */
    public static void dePress(File file){
        File desDir = new File(file.getParentFile(), file.getName());
        if(!desDir.exists()) {
            desDir.mkdirs();
        }
        dePress(file, desDir, null);
    }
}